#include "OAT.h"

#include <cwchar>
#include <cstring>

namespace Rz { namespace Utils { namespace Cryptography { namespace OAT {

Hash HashData(const void* data, size_t len)
{
	const u8* key = static_cast<const u8*>(data);
	Hash h = 0;

	for (size_t i = 0; i < len; ++i)
	{
		h += key[i];
		h += (h << 10);
		h ^= (h >> 6 );
	}

	h += (h << 3 );
	h ^= (h >> 11);
	h += (h << 15);

	return h;
}

Hash HashString(const char* str)
{
	size_t len = strlen(str);
	return HashData(static_cast<const void*>(str), len);
}

Hash HashString(const wchar_t* str)
{
	size_t len = wcslen(str);
	return HashData(static_cast<const void*>(str), len * sizeof(wchar_t));
}

} } } }
